package org.demo;

import org.openjdk.jmh.annotations.Param;
import org.openjdk.jmh.annotations.Scope;
import org.openjdk.jmh.annotations.State;

import java.util.ArrayList;
import java.util.List;
import java.util.Random;

/**
 * {@code @State}: 标记状态对象,定义对象在工作线程之间共享的程度。
 * Scope.Benchmark: 所有测试线程共享一个实例，用于测试有状态实例在多线程共享下的性能
 *
 * @author yexi
 */
@State(value = Scope.Benchmark)
public class PS {

    @Param(value = {"10", "50", "100"})
    private int length;

    static List<Integer> nums = new ArrayList<>();

    static {
        Random r = new Random();
        for (int i = 0; i < 1000; i++) nums.add(1000000 + r.nextInt(1000000));
    }

    /**
     * 串行处理
     */
    public static void foreach() {
        nums.forEach(v -> isPrime(v));
    }

    /**
     * 并行处理
     */
    static void parallel() {
        nums.parallelStream().forEach(PS::isPrime);
    }

    /**
     * 是不是质数
     */
    static boolean isPrime(int num) {
        for (int i = 2; i <= num / 2; i++) {
            if (num % i == 0) return false;
        }
        return true;
    }
}
